package org.dromara.common.encrypt.core.encryptor;

import org.dromara.common.encrypt.core.EncryptContext;
import org.dromara.common.encrypt.enumd.AlgorithmType;
import org.dromara.common.encrypt.enumd.EncodeType;
import org.dromara.common.encrypt.utils.EncryptUtils;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：sm4算法实现
 */
public class Sm4Encryptor extends AbstractEncryptor {

    /**
     * 加密上下文 用于encryptor传递必要的参数。
     */
    private final EncryptContext context;

    /**
     * 构造函数，用于初始化Sm4Encryptor对象
     * @param context 加密上下文，包含加密操作所需的参数和配置
     */
    public Sm4Encryptor(EncryptContext context) {
        // 调用父类的构造函数，传递加密上下文
        super(context);
        // 将加密上下文保存在实例变量中，以便后续操作
        this.context = context;
    }

    /**
     * 获得当前算法
     * 返回当前算法的类型
     *
     * @return 当前算法的类型，此处为SM4
     */
    @Override
    public AlgorithmType algorithm() {
        return AlgorithmType.SM4;
    }

    /**
     * 加密
     * 根据指定的编码类型对值进行加密
     * 此方法使用SM4加密算法，根据传入的编码类型（HEX或其他），选择不同的加密方式
     * 如果编码类型是HEX，则调用EncryptUtils.encryptBySm4Hex方法，否则调用EncryptUtils.encryptBySm4方法
     *
     * @param value 待加密的字符串值
     * @param encodeType 加密算法的编码类型，决定了使用哪种加密方式
     * @return 加密后的字符串
     */
    @Override
    public String encrypt(String value, EncodeType encodeType) {
        // 根据编码类型选择不同的加密方式
        if (encodeType == EncodeType.HEX) {
            // 如果编码类型为HEX，则使用SM4算法对值进行十六进制加密
            return EncryptUtils.encryptBySm4Hex(value, context.getPassword());
        } else {
            // 如果编码类型不是HEX，则使用SM4算法对值进行直接加密
            return EncryptUtils.encryptBySm4(value, context.getPassword());
        }
    }

    /**
     * 解密
     * 使用SM4算法解密指定的字符串
     * 此方法主要用于解密之前使用SM4算法加密的数据
     *
     * @param value 待解密的字符串，该字符串应该是使用SM4算法加密的
     * @return 解密后的字符串如果解密失败，将返回null
     */
    @Override
    public String decrypt(String value) {
        // 调用EncryptUtils类的decryptBySm4方法，传入待解密的字符串和解密密钥
        // context.getPassword()方法获取解密密钥
        return EncryptUtils.decryptBySm4(value, context.getPassword());
    }
}
